using DotNetHackathon.GBA.ApiCommon;
using DotNetHackathon.GBA.ApiCommon.ExceptionHandling;
using HealthChecks.UI.Client;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Vaccination.API.Infrastructure;
using Vaccination.API.Infrastructure.Repositories;
using Vaccination.API.Repositories;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddApiCommonServices();
builder.Services.AddDbContext<VaccinationDbContext>(optoins =>
{
    optoins.UseSqlServer(builder.Configuration.GetConnectionString("SqlServerUrl"));
});
builder.Services.AddScoped<IVaccinationInfoRepository, VaccinationInfoRepository>();

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
{
    //options.SuppressModelStateInvalidFilter = false;
    options.InvalidModelStateResponseFactory = context =>
    {
        var modelStateEntries = context.ModelState.Where(e => e.Value?.Errors.Count > 0).ToArray();
        var errorResult = new ErrorResult()
        {
            Code = context.HttpContext.Response.StatusCode.ToString(),
            Message = modelStateEntries.Select(t => t.Value?.Errors.FirstOrDefault())?.FirstOrDefault()?.ErrorMessage
        };

        return new BadRequestObjectResult(errorResult);
    };
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddHealthChecks()
    .AddCheck("self", () => HealthCheckResult.Healthy());

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<VaccinationDbContext>();
    db.Database.Migrate();
}

app.UseMiddleware<ExceptionHandlingMiddleware>();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapHealthChecks("/hc", new HealthCheckOptions()
{
    Predicate = _ => true,
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
app.MapHealthChecks("/liveness", new HealthCheckOptions
{
    Predicate = r => r.Name.Contains("self")
});

app.MapControllers();

app.Run();
